package net.lzzy.practices.web.admin;

import net.lzzy.practices.constants.ApiConstants;
import net.lzzy.practices.constants.Messages;
import net.lzzy.practices.entities.User;
import net.lzzy.practices.services.UserService;
import net.lzzy.practices.utils.AuthUtils;
import net.lzzy.practices.web.models.ApiResult;
import net.lzzy.practices.web.models.VmUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @author Jaymo on 2022/5/16
 *
 */
@CrossOrigin
@RestController
@RequestMapping(ApiConstants.ROUTE_USER_ROOT)
public class UserApiController {

    private final UserService service;

    @Autowired
    public UserApiController(UserService service){
        this.service =  service;
    }

    @GetMapping(ApiConstants.ROUTE_USER_ALL)
    public ApiResult getUsers(@RequestParam String token){
       System.out.println("方法开始执行");
        if(AuthUtils.illegalUser(token, new int[] {User.TYPE_ADMIN})){
            return  new ApiResult(false, Messages.No_PERMISSION.toString(), null);
        }
        List<VmUser> users = new ArrayList<>();
        service.get().forEach(user -> users.add(VmUser.create(user, true)));
        return new ApiResult(true,users.size() + "" , users);
    }
    @GetMapping(ApiConstants.ROUTE_USER_PAGE)
    public ApiResult getPagedUsers(@RequestParam String token, @RequestParam int page, @RequestParam int size){
        if (AuthUtils.illegalUser(token,new int[]{User.TYPE_ADMIN})){
            return  new ApiResult(false,Messages.No_PERMISSION.toString(), null);
        }
        List<VmUser> users = new ArrayList<>();
        service.get(page,size).forEach(user -> users.add(VmUser.create(user,true)));
        return  new ApiResult(true, service.count() + "", users);
    }
    @GetMapping(ApiConstants.ROUTE_USER_SEARCH)
    public ApiResult search(@RequestParam String token, @PathVariable String kw){
        List<VmUser> users = new ArrayList<>();
        service.search(kw).forEach(user -> users.add(VmUser.create(user, true)));
        return new ApiResult(true, users.size() + "",users);
    }

    @GetMapping(ApiConstants.ROUTE_USER_APPLYING)
    public ApiResult  getApplyingUsers(@RequestParam String token){
        List<VmUser> users = new ArrayList<>();
        service.getApplying(true).forEach(user -> users.add(VmUser.create(user,true)));
        return new ApiResult(true, users.size() +"", true);
    }

    @PostMapping(ApiConstants.ROUTE_USER_APPROVE)
    public ApiResult approve(@RequestParam String token, @RequestParam UUID id){
        User user = service.approveTeacher(id);
        if (user == null){
            return  new ApiResult(false, Messages.WRING_ID.toString(),null );
        }
        return  new ApiResult(true,"",VmUser.create(user,true));
    }

    @PostMapping(ApiConstants.ROUTE_USER_DECLINE)
    public ApiResult decline(@RequestParam String token, @RequestParam UUID id){
        User user = service.declineTeacher(id);
        if (user == null){
            return  new ApiResult(false, Messages.WRING_ID.toString(), null);
        }
        return  new ApiResult(true,"",VmUser.create(user,true));
    }

   @PostMapping(ApiConstants.ROUTE_USER_BAN)
    public  ApiResult ban(@RequestParam String token, @RequestParam UUID id){
        User user = service.banUser(id);
        if (user == null){
            return  new ApiResult(false,Messages.WRING_ID.toString(), null);

        }
        return  new ApiResult(true,"",VmUser.create(user,true));
   }
}
